// c++函数模板的基本定义、函数模板的重载、函数模板的特化
#include <iostream>
#include <cstring>
using namespace std;

// int maxValue(int a,int b)
// {
//     return a > b ? a : b;
// }

// float maxValue(float a,float b)
// {
//     return a > b ? a : b;
// }

template <typename T>
T maxValue(T a,T b)
{
    return a > b ? a : b;
}

//重载函数模板
template <typename T>
T maxValue(T a,T b,T c)
{
    int m;
    if(a > b)
        m = a;
    if(c > a)
        m = c;
    
        return m;
}

//特化函数模板
template <>
const char* maxValue(const char *a,const char * b)
{
    return strcmp(a,b) > 0 ? a : b;
}

int main(int argc, char const *argv[])
{
    int a = 1;
    int b = 2;
    cout << maxValue<int>(a,b) << endl;

    float x = 1.1;
    float y = 1.2;
    cout << maxValue<float>(x,y) << endl;

    int a1 = 3;
    int a2 = 2;
    int a3 = 1;
    cout << maxValue(a1,a2,a3) << endl;

    const char *s1 = "abc";
    const char *s2 = "ABC";
    cout << maxValue(s1,s2) << endl;

    return 0;
}

//传参的时候可以不写类型<int> <float>等，但是定义函数模板时必须写
//优先级： 普通模板 > 特化模板 > 通用模板